#include<bits/stdc++.h>
using namespace std;
const int P=1e9+7,I2=P+1>>1;
inline int qpow(int a,int b){
  int r=1;
  while(b){
    if(b&1)r=1ll*r*a%P;
    a=1ll*a*a%P,b>>=1;
  }
  return r;
}
inline int add(int x,int y){
  int s=x+y; if(s>=P)s-=P; return s;
}
inline void self_add(int &x,int y){
  if((x+=y)>=P)x-=P;
}
struct info{
  int a,b,c;
  info(int a=1,int b=0,int c=0):a(a),b(b),c(c){}
  inline info operator +(const info &r){
    int x=1ll*a*add(r.a,r.c)%P,y=add(1ll*a*r.b%P,1ll*b*add(r.a,r.c)%P);
    return info(x,y,add(1,P-add(x,y)));
  }
};
int main(){
  freopen("a.in","r",stdin);
  freopen("a.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,c=0; cin>>n;
  vector<vector<int> > g(n+1);
  for(int i=1;i<=n;i++){
    int p; cin>>p;
    g[p].emplace_back(i);
  }
  vector<int> d(n+1),e(n+1,1);
  vector<map<int,info> > f(n+1);
  auto dfs=[&](auto &&self,int u)->void{
    int mx=0,h=-1;
    for(int i:g[u]){
      d[i]=d[u]+1,self(self,i),e[u]+=e[i];
      if(e[i]>mx)mx=e[i],h=i;
    }
    if(~h){
      swap(f[u],f[h]);
      set<int> d;
      for(int i:g[u])
        if(i!=h)
          for(auto q:f[i]){
            if(d.find(q.first)==d.end()){
              d.emplace(q.first);
              if(f[u].find(q.first)!=f[u].end())
                self_add(f[u][q.first].a,f[u][q.first].c),f[u][q.first].c=0;
            }
            f[u][q.first]=f[u][q.first]+q.second;
          }
    }
    f[u][d[u]]=info(I2,I2,0);
  };
  dfs(dfs,0);
  for(auto i:f[0])self_add(c,i.second.b);
  cout<<1ll*c*qpow(2,n+1)%P<<endl;
  return 0;
}